// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by google-apis-code-generator 1.5.1
//     C# generator version: 1.22.0
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

/**
 * \brief
 *   Google Storage Transfer API Version v1
 *
 * \section ApiInfo API Version Information
 *    <table>
 *      <tr><th>API
 *          <td><a href='https://cloud.google.com/storage/transfer'>Google Storage Transfer API</a>
 *      <tr><th>API Version<td>v1
 *      <tr><th>API Rev<td>20150811 (222)
 *      <tr><th>API Docs
 *          <td><a href='https://cloud.google.com/storage/transfer'>
 *              https://cloud.google.com/storage/transfer</a>
 *      <tr><th>Discovery Name<td>storagetransfer
 *    </table>
 *
 * \section ForMoreInfo For More Information
 *
 * The complete API documentation for using Google Storage Transfer API can be found at
 * <a href='https://cloud.google.com/storage/transfer'>https://cloud.google.com/storage/transfer</a>.
 *
 * For more information about the Google APIs Client Library for .NET, see
 * <a href='https://developers.google.com/api-client-library/dotnet/get_started'>
 * https://developers.google.com/api-client-library/dotnet/get_started</a>
 */

namespace Google.Apis.Storagetransfer.v1
{
    /// <summary>The Storagetransfer Service.</summary>
    public class StoragetransferService : Google.Apis.Services.BaseClientService
    {
        /// <summary>The API version.</summary>
        public const string Version = "v1";

        /// <summary>The discovery version used to generate this service.</summary>
        public static Google.Apis.Discovery.DiscoveryVersion DiscoveryVersionUsed =
            Google.Apis.Discovery.DiscoveryVersion.Version_1_0;

        /// <summary>Constructs a new service.</summary>
        public StoragetransferService() :
            this(new Google.Apis.Services.BaseClientService.Initializer()) {}

        /// <summary>Constructs a new service.</summary>
        /// <param name="initializer">The service initializer.</param>
        public StoragetransferService(Google.Apis.Services.BaseClientService.Initializer initializer)
            : base(initializer)
        {
            googleServiceAccounts = new GoogleServiceAccountsResource(this);
            transferJobs = new TransferJobsResource(this);
            transferOperations = new TransferOperationsResource(this);
            v1 = new V1Resource(this);
        }

        /// <summary>Gets the service supported features.</summary>
        public override System.Collections.Generic.IList<string> Features
        {
            get { return new string[0]; }
        }

        /// <summary>Gets the service name.</summary>
        public override string Name
        {
            get { return "storagetransfer"; }
        }

        /// <summary>Gets the service base URI.</summary>
        public override string BaseUri
        {
            get { return "https://storagetransfer.googleapis.com/"; }
        }

        /// <summary>Gets the service base path.</summary>
        public override string BasePath
        {
            get { return ""; }
        }

        /// <summary>Available OAuth 2.0 scopes for use with the Google Storage Transfer API.</summary>
        public class Scope
        {
            /// <summary>View and manage your data across Google Cloud Platform services</summary>
            public static string CloudPlatform = "https://www.googleapis.com/auth/cloud-platform";

        }



        private readonly GoogleServiceAccountsResource googleServiceAccounts;

        /// <summary>Gets the GoogleServiceAccounts resource.</summary>
        public virtual GoogleServiceAccountsResource GoogleServiceAccounts
        {
            get { return googleServiceAccounts; }
        }

        private readonly TransferJobsResource transferJobs;

        /// <summary>Gets the TransferJobs resource.</summary>
        public virtual TransferJobsResource TransferJobs
        {
            get { return transferJobs; }
        }

        private readonly TransferOperationsResource transferOperations;

        /// <summary>Gets the TransferOperations resource.</summary>
        public virtual TransferOperationsResource TransferOperations
        {
            get { return transferOperations; }
        }

        private readonly V1Resource v1;

        /// <summary>Gets the V1 resource.</summary>
        public virtual V1Resource V1
        {
            get { return v1; }
        }
    }

    ///<summary>A base abstract class for Storagetransfer requests.</summary>
    public abstract class StoragetransferBaseServiceRequest<TResponse> : Google.Apis.Requests.ClientServiceRequest<TResponse>
    {
        ///<summary>Constructs a new StoragetransferBaseServiceRequest instance.</summary>
        protected StoragetransferBaseServiceRequest(Google.Apis.Services.IClientService service)
            : base(service)
        {
        }

        /// <summary>V1 error format.</summary>
        [Google.Apis.Util.RequestParameterAttribute("$.xgafv", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Xgafv { get; set; }

        /// <summary>OAuth access token.</summary>
        [Google.Apis.Util.RequestParameterAttribute("access_token", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string AccessToken { get; set; }

        /// <summary>Data format for response.</summary>
        /// [default: json]
        [Google.Apis.Util.RequestParameterAttribute("alt", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Alt { get; set; }

        /// <summary>OAuth bearer token.</summary>
        [Google.Apis.Util.RequestParameterAttribute("bearer_token", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string BearerToken { get; set; }

        /// <summary>JSONP</summary>
        [Google.Apis.Util.RequestParameterAttribute("callback", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Callback { get; set; }

        /// <summary>Selector specifying which fields to include in a partial response.</summary>
        [Google.Apis.Util.RequestParameterAttribute("fields", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Fields { get; set; }

        /// <summary>API key. Your API key identifies your project and provides you with API access, quota, and reports.
        /// Required unless you provide an OAuth 2.0 token.</summary>
        [Google.Apis.Util.RequestParameterAttribute("key", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string Key { get; set; }

        /// <summary>OAuth 2.0 token for the current user.</summary>
        [Google.Apis.Util.RequestParameterAttribute("oauth_token", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string OauthToken { get; set; }

        /// <summary>Pretty-print response.</summary>
        /// [default: true]
        [Google.Apis.Util.RequestParameterAttribute("pp", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<bool> Pp { get; set; }

        /// <summary>Returns response with indentations and line breaks.</summary>
        /// [default: true]
        [Google.Apis.Util.RequestParameterAttribute("prettyPrint", Google.Apis.Util.RequestParameterType.Query)]
        public virtual System.Nullable<bool> PrettyPrint { get; set; }

        /// <summary>Available to use for quota purposes for server-side applications. Can be any arbitrary string
        /// assigned to a user, but should not exceed 40 characters.</summary>
        [Google.Apis.Util.RequestParameterAttribute("quotaUser", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string QuotaUser { get; set; }

        /// <summary>Legacy upload protocol for media (e.g. "media", "multipart").</summary>
        [Google.Apis.Util.RequestParameterAttribute("uploadType", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string UploadType { get; set; }

        /// <summary>Upload protocol for media (e.g. "raw", "multipart").</summary>
        [Google.Apis.Util.RequestParameterAttribute("upload_protocol", Google.Apis.Util.RequestParameterType.Query)]
        public virtual string UploadProtocol { get; set; }

        /// <summary>Initializes Storagetransfer parameter list.</summary>
        protected override void InitParameters()
        {
            base.InitParameters();

            RequestParameters.Add(
                "$.xgafv", new Google.Apis.Discovery.Parameter
                {
                    Name = "$.xgafv",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "access_token", new Google.Apis.Discovery.Parameter
                {
                    Name = "access_token",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "alt", new Google.Apis.Discovery.Parameter
                {
                    Name = "alt",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "json",
                    Pattern = null,
                });
            RequestParameters.Add(
                "bearer_token", new Google.Apis.Discovery.Parameter
                {
                    Name = "bearer_token",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "callback", new Google.Apis.Discovery.Parameter
                {
                    Name = "callback",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "fields", new Google.Apis.Discovery.Parameter
                {
                    Name = "fields",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "key", new Google.Apis.Discovery.Parameter
                {
                    Name = "key",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "oauth_token", new Google.Apis.Discovery.Parameter
                {
                    Name = "oauth_token",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "pp", new Google.Apis.Discovery.Parameter
                {
                    Name = "pp",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "true",
                    Pattern = null,
                });
            RequestParameters.Add(
                "prettyPrint", new Google.Apis.Discovery.Parameter
                {
                    Name = "prettyPrint",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = "true",
                    Pattern = null,
                });
            RequestParameters.Add(
                "quotaUser", new Google.Apis.Discovery.Parameter
                {
                    Name = "quotaUser",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "uploadType", new Google.Apis.Discovery.Parameter
                {
                    Name = "uploadType",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
            RequestParameters.Add(
                "upload_protocol", new Google.Apis.Discovery.Parameter
                {
                    Name = "upload_protocol",
                    IsRequired = false,
                    ParameterType = "query",
                    DefaultValue = null,
                    Pattern = null,
                });
        }
    }

    /// <summary>The "googleServiceAccounts" collection of methods.</summary>
    public class GoogleServiceAccountsResource
    {
        private const string Resource = "googleServiceAccounts";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public GoogleServiceAccountsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Returns the Google service account that is used by Storage Transfer Service to access buckets in
        /// the project where transfers run or in other projects. Each Google service account is associated with one
        /// Google Developers Console project. Users should add this service account to the Google Cloud Storage bucket
        /// ACLs to grant access to Storage Transfer Service. This service account is created and owned by Storage
        /// Transfer Service and can only be used by Storage Transfer Service.</summary>
        /// <param name="projectId">The ID of the Google Developers Console project that the Google service account is
        /// associated with. Required.</param>
        public virtual GetRequest Get(string projectId)
        {
            return new GetRequest(service, projectId);
        }

        /// <summary>Returns the Google service account that is used by Storage Transfer Service to access buckets in
        /// the project where transfers run or in other projects. Each Google service account is associated with one
        /// Google Developers Console project. Users should add this service account to the Google Cloud Storage bucket
        /// ACLs to grant access to Storage Transfer Service. This service account is created and owned by Storage
        /// Transfer Service and can only be used by Storage Transfer Service.</summary>
        public class GetRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.GoogleServiceAccount>
        {
            /// <summary>Constructs a new Get request.</summary>
            public GetRequest(Google.Apis.Services.IClientService service, string projectId)
                : base(service)
            {
                ProjectId = projectId;
                InitParameters();
            }


            /// <summary>The ID of the Google Developers Console project that the Google service account is associated
            /// with. Required.</summary>
            [Google.Apis.Util.RequestParameterAttribute("projectId", Google.Apis.Util.RequestParameterType.Path)]
            public virtual string ProjectId { get; private set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "get"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/googleServiceAccounts/{projectId}"; }
            }

            /// <summary>Initializes Get parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "projectId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "projectId",
                        IsRequired = true,
                        ParameterType = "path",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }

    /// <summary>The "transferJobs" collection of methods.</summary>
    public class TransferJobsResource
    {
        private const string Resource = "transferJobs";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public TransferJobsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Creates a transfer job that runs periodically.</summary>
        /// <param name="body">The body of the request.</param>
        public virtual CreateRequest Create(Google.Apis.Storagetransfer.v1.Data.TransferJob body)
        {
            return new CreateRequest(service, body);
        }

        /// <summary>Creates a transfer job that runs periodically.</summary>
        public class CreateRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.TransferJob>
        {
            /// <summary>Constructs a new Create request.</summary>
            public CreateRequest(Google.Apis.Services.IClientService service, Google.Apis.Storagetransfer.v1.Data.TransferJob body)
                : base(service)
            {
                Body = body;
                InitParameters();
            }



            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.Storagetransfer.v1.Data.TransferJob Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "create"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/transferJobs"; }
            }

            /// <summary>Initializes Create parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

            }

        }

        /// <summary>Gets a transfer job.</summary>
        /// <param name="jobName">The job to get. Required.</param>
        public virtual GetRequest Get(string jobName)
        {
            return new GetRequest(service, jobName);
        }

        /// <summary>Gets a transfer job.</summary>
        public class GetRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.TransferJob>
        {
            /// <summary>Constructs a new Get request.</summary>
            public GetRequest(Google.Apis.Services.IClientService service, string jobName)
                : base(service)
            {
                JobName = jobName;
                InitParameters();
            }


            /// <summary>The job to get. Required.</summary>
            [Google.Apis.Util.RequestParameterAttribute("jobName", Google.Apis.Util.RequestParameterType.Path)]
            public virtual string JobName { get; private set; }

            /// <summary>The ID of the Google Developers Console project that owns the job. Required.</summary>
            [Google.Apis.Util.RequestParameterAttribute("projectId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ProjectId { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "get"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/{+jobName}"; }
            }

            /// <summary>Initializes Get parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "jobName", new Google.Apis.Discovery.Parameter
                    {
                        Name = "jobName",
                        IsRequired = true,
                        ParameterType = "path",
                        DefaultValue = null,
                        Pattern = @"^transferJobs/.*$",
                    });
                RequestParameters.Add(
                    "projectId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "projectId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Lists transfer jobs.</summary>
        public virtual ListRequest List()
        {
            return new ListRequest(service);
        }

        /// <summary>Lists transfer jobs.</summary>
        public class ListRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.ListTransferJobsResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service)
                : base(service)
            {
                InitParameters();
            }


            /// <summary>A list of query parameters specified as JSON text in the form of
            /// {"`project_id`":"my_project_id", "`job_names`":["jobid1","jobid2",...],
            /// "`job_statuses`":["status1","status2",...]}. Since `job_names` and `job_statuses` support multiple
            /// values, their values must be specified with array notation. `project_id` is required. `job_names` and
            /// `job_statuses` are optional. The valid values for `job_statuses` are case-insensitive: `ENABLED`,
            /// `DISABLED`, and `DELETED`.</summary>
            [Google.Apis.Util.RequestParameterAttribute("filter", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Filter { get; set; }

            /// <summary>The list page size. The max allowed value is 256.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<int> PageSize { get; set; }

            /// <summary>The list page token.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/transferJobs"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "filter", new Google.Apis.Discovery.Parameter
                    {
                        Name = "filter",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageSize", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageSize",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Updates a transfer job. Updating a job's transfer spec does not affect transfer operations that are
        /// running already. Updating the scheduling of a job is not allowed.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="jobName">The name of job to update. Required.</param>
        public virtual PatchRequest Patch(Google.Apis.Storagetransfer.v1.Data.UpdateTransferJobRequest body, string jobName)
        {
            return new PatchRequest(service, body, jobName);
        }

        /// <summary>Updates a transfer job. Updating a job's transfer spec does not affect transfer operations that are
        /// running already. Updating the scheduling of a job is not allowed.</summary>
        public class PatchRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.TransferJob>
        {
            /// <summary>Constructs a new Patch request.</summary>
            public PatchRequest(Google.Apis.Services.IClientService service, Google.Apis.Storagetransfer.v1.Data.UpdateTransferJobRequest body, string jobName)
                : base(service)
            {
                JobName = jobName;
                Body = body;
                InitParameters();
            }


            /// <summary>The name of job to update. Required.</summary>
            [Google.Apis.Util.RequestParameterAttribute("jobName", Google.Apis.Util.RequestParameterType.Path)]
            public virtual string JobName { get; private set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.Storagetransfer.v1.Data.UpdateTransferJobRequest Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "patch"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "PATCH"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/{+jobName}"; }
            }

            /// <summary>Initializes Patch parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "jobName", new Google.Apis.Discovery.Parameter
                    {
                        Name = "jobName",
                        IsRequired = true,
                        ParameterType = "path",
                        DefaultValue = null,
                        Pattern = @"^transferJobs/.*$",
                    });
            }

        }
    }

    /// <summary>The "transferOperations" collection of methods.</summary>
    public class TransferOperationsResource
    {
        private const string Resource = "transferOperations";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public TransferOperationsResource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Cancels a transfer. Use the get method to check whether the cancellation succeeded or whether the
        /// operation completed despite cancellation.</summary>
        /// <param name="name">The name of the operation resource to be cancelled.</param>
        public virtual CancelRequest Cancel(string name)
        {
            return new CancelRequest(service, name);
        }

        /// <summary>Cancels a transfer. Use the get method to check whether the cancellation succeeded or whether the
        /// operation completed despite cancellation.</summary>
        public class CancelRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.Empty>
        {
            /// <summary>Constructs a new Cancel request.</summary>
            public CancelRequest(Google.Apis.Services.IClientService service, string name)
                : base(service)
            {
                Name = name;
                InitParameters();
            }


            /// <summary>The name of the operation resource to be cancelled.</summary>
            [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
            public virtual string Name { get; private set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "cancel"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/{+name}:cancel"; }
            }

            /// <summary>Initializes Cancel parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "name", new Google.Apis.Discovery.Parameter
                    {
                        Name = "name",
                        IsRequired = true,
                        ParameterType = "path",
                        DefaultValue = null,
                        Pattern = @"^transferOperations/.*$",
                    });
            }

        }

        /// <summary>This method is not supported and the server returns `UNIMPLEMENTED`.</summary>
        /// <param name="name">The name of the operation resource to be deleted.</param>
        public virtual DeleteRequest Delete(string name)
        {
            return new DeleteRequest(service, name);
        }

        /// <summary>This method is not supported and the server returns `UNIMPLEMENTED`.</summary>
        public class DeleteRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.Empty>
        {
            /// <summary>Constructs a new Delete request.</summary>
            public DeleteRequest(Google.Apis.Services.IClientService service, string name)
                : base(service)
            {
                Name = name;
                InitParameters();
            }


            /// <summary>The name of the operation resource to be deleted.</summary>
            [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
            public virtual string Name { get; private set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "delete"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "DELETE"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/{+name}"; }
            }

            /// <summary>Initializes Delete parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "name", new Google.Apis.Discovery.Parameter
                    {
                        Name = "name",
                        IsRequired = true,
                        ParameterType = "path",
                        DefaultValue = null,
                        Pattern = @"^transferOperations/.*$",
                    });
            }

        }

        /// <summary>Gets the latest state of a long-running operation. Clients can use this method to poll the
        /// operation result at intervals as recommended by the API service.</summary>
        /// <param name="name">The name of the operation resource.</param>
        public virtual GetRequest Get(string name)
        {
            return new GetRequest(service, name);
        }

        /// <summary>Gets the latest state of a long-running operation. Clients can use this method to poll the
        /// operation result at intervals as recommended by the API service.</summary>
        public class GetRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.Operation>
        {
            /// <summary>Constructs a new Get request.</summary>
            public GetRequest(Google.Apis.Services.IClientService service, string name)
                : base(service)
            {
                Name = name;
                InitParameters();
            }


            /// <summary>The name of the operation resource.</summary>
            [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
            public virtual string Name { get; private set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "get"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/{+name}"; }
            }

            /// <summary>Initializes Get parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "name", new Google.Apis.Discovery.Parameter
                    {
                        Name = "name",
                        IsRequired = true,
                        ParameterType = "path",
                        DefaultValue = null,
                        Pattern = @"^transferOperations/.*$",
                    });
            }

        }

        /// <summary>Lists operations that match the specified filter in the request. If the server doesn't support this
        /// method, it returns `UNIMPLEMENTED`. NOTE: the `name` binding below allows API services to override the
        /// binding to use different resource name schemes, such as `users/operations`.</summary>
        /// <param name="name">The value `transferOperations`.</param>
        public virtual ListRequest List(string name)
        {
            return new ListRequest(service, name);
        }

        /// <summary>Lists operations that match the specified filter in the request. If the server doesn't support this
        /// method, it returns `UNIMPLEMENTED`. NOTE: the `name` binding below allows API services to override the
        /// binding to use different resource name schemes, such as `users/operations`.</summary>
        public class ListRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.ListOperationsResponse>
        {
            /// <summary>Constructs a new List request.</summary>
            public ListRequest(Google.Apis.Services.IClientService service, string name)
                : base(service)
            {
                Name = name;
                InitParameters();
            }


            /// <summary>The value `transferOperations`.</summary>
            [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
            public virtual string Name { get; private set; }

            /// <summary>The standard list filter.</summary>
            [Google.Apis.Util.RequestParameterAttribute("filter", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string Filter { get; set; }

            /// <summary>The standard list page size.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageSize", Google.Apis.Util.RequestParameterType.Query)]
            public virtual System.Nullable<int> PageSize { get; set; }

            /// <summary>The standard list page token.</summary>
            [Google.Apis.Util.RequestParameterAttribute("pageToken", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string PageToken { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "list"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/{+name}"; }
            }

            /// <summary>Initializes List parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "name", new Google.Apis.Discovery.Parameter
                    {
                        Name = "name",
                        IsRequired = true,
                        ParameterType = "path",
                        DefaultValue = null,
                        Pattern = @"^transferOperations$",
                    });
                RequestParameters.Add(
                    "filter", new Google.Apis.Discovery.Parameter
                    {
                        Name = "filter",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageSize", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageSize",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
                RequestParameters.Add(
                    "pageToken", new Google.Apis.Discovery.Parameter
                    {
                        Name = "pageToken",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }

        /// <summary>Pauses a transfer operation.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="name">The name of the transfer operation. Required.</param>
        public virtual PauseRequest Pause(Google.Apis.Storagetransfer.v1.Data.PauseTransferOperationRequest body, string name)
        {
            return new PauseRequest(service, body, name);
        }

        /// <summary>Pauses a transfer operation.</summary>
        public class PauseRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.Empty>
        {
            /// <summary>Constructs a new Pause request.</summary>
            public PauseRequest(Google.Apis.Services.IClientService service, Google.Apis.Storagetransfer.v1.Data.PauseTransferOperationRequest body, string name)
                : base(service)
            {
                Name = name;
                Body = body;
                InitParameters();
            }


            /// <summary>The name of the transfer operation. Required.</summary>
            [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
            public virtual string Name { get; private set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.Storagetransfer.v1.Data.PauseTransferOperationRequest Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "pause"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/{+name}:pause"; }
            }

            /// <summary>Initializes Pause parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "name", new Google.Apis.Discovery.Parameter
                    {
                        Name = "name",
                        IsRequired = true,
                        ParameterType = "path",
                        DefaultValue = null,
                        Pattern = @"^transferOperations/.*$",
                    });
            }

        }

        /// <summary>Resumes a transfer operation that is paused.</summary>
        /// <param name="body">The body of the request.</param>
        /// <param name="name">The name of the transfer operation. Required.</param>
        public virtual ResumeRequest Resume(Google.Apis.Storagetransfer.v1.Data.ResumeTransferOperationRequest body, string name)
        {
            return new ResumeRequest(service, body, name);
        }

        /// <summary>Resumes a transfer operation that is paused.</summary>
        public class ResumeRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.Empty>
        {
            /// <summary>Constructs a new Resume request.</summary>
            public ResumeRequest(Google.Apis.Services.IClientService service, Google.Apis.Storagetransfer.v1.Data.ResumeTransferOperationRequest body, string name)
                : base(service)
            {
                Name = name;
                Body = body;
                InitParameters();
            }


            /// <summary>The name of the transfer operation. Required.</summary>
            [Google.Apis.Util.RequestParameterAttribute("name", Google.Apis.Util.RequestParameterType.Path)]
            public virtual string Name { get; private set; }


            /// <summary>Gets or sets the body of this request.</summary>
            Google.Apis.Storagetransfer.v1.Data.ResumeTransferOperationRequest Body { get; set; }

            ///<summary>Returns the body of the request.</summary>
            protected override object GetBody() { return Body; }

            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "resume"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "POST"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1/{+name}:resume"; }
            }

            /// <summary>Initializes Resume parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "name", new Google.Apis.Discovery.Parameter
                    {
                        Name = "name",
                        IsRequired = true,
                        ParameterType = "path",
                        DefaultValue = null,
                        Pattern = @"^transferOperations/.*$",
                    });
            }

        }
    }

    /// <summary>The "v1" collection of methods.</summary>
    public class V1Resource
    {
        private const string Resource = "v1";

        /// <summary>The service which this resource belongs to.</summary>
        private readonly Google.Apis.Services.IClientService service;

        /// <summary>Constructs a new resource.</summary>
        public V1Resource(Google.Apis.Services.IClientService service)
        {
            this.service = service;

        }


        /// <summary>Returns the Google service account that is used by Storage Transfer Service to access buckets in
        /// the project where transfers run or in other projects. Each Google service account is associated with one
        /// Google Developers Console project. Users should add this service account to the Google Cloud Storage bucket
        /// ACLs to grant access to Storage Transfer Service. This service account is created and owned by Storage
        /// Transfer Service and can only be used by Storage Transfer Service.</summary>
        public virtual GetGoogleServiceAccountRequest GetGoogleServiceAccount()
        {
            return new GetGoogleServiceAccountRequest(service);
        }

        /// <summary>Returns the Google service account that is used by Storage Transfer Service to access buckets in
        /// the project where transfers run or in other projects. Each Google service account is associated with one
        /// Google Developers Console project. Users should add this service account to the Google Cloud Storage bucket
        /// ACLs to grant access to Storage Transfer Service. This service account is created and owned by Storage
        /// Transfer Service and can only be used by Storage Transfer Service.</summary>
        public class GetGoogleServiceAccountRequest : StoragetransferBaseServiceRequest<Google.Apis.Storagetransfer.v1.Data.GoogleServiceAccount>
        {
            /// <summary>Constructs a new GetGoogleServiceAccount request.</summary>
            public GetGoogleServiceAccountRequest(Google.Apis.Services.IClientService service)
                : base(service)
            {
                InitParameters();
            }


            /// <summary>The ID of the Google Developers Console project that the Google service account is associated
            /// with. Required.</summary>
            [Google.Apis.Util.RequestParameterAttribute("projectId", Google.Apis.Util.RequestParameterType.Query)]
            public virtual string ProjectId { get; set; }


            ///<summary>Gets the method name.</summary>
            public override string MethodName
            {
                get { return "getGoogleServiceAccount"; }
            }

            ///<summary>Gets the HTTP method.</summary>
            public override string HttpMethod
            {
                get { return "GET"; }
            }

            ///<summary>Gets the REST path.</summary>
            public override string RestPath
            {
                get { return "v1:getGoogleServiceAccount"; }
            }

            /// <summary>Initializes GetGoogleServiceAccount parameter list.</summary>
            protected override void InitParameters()
            {
                base.InitParameters();

                RequestParameters.Add(
                    "projectId", new Google.Apis.Discovery.Parameter
                    {
                        Name = "projectId",
                        IsRequired = false,
                        ParameterType = "query",
                        DefaultValue = null,
                        Pattern = null,
                    });
            }

        }
    }
}

namespace Google.Apis.Storagetransfer.v1.Data
{    

    /// <summary>AWS access key (see [AWS Security Credentials](http://docs.aws.amazon.com/general/latest/gr/aws-
    /// security-credentials.html)).</summary>
    public class AwsAccessKey : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>AWS access key ID. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("accessKeyId")]
        public virtual string AccessKeyId { get; set; } 

        /// <summary>AWS secret access key. This field is not returned in RPC responses. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("secretAccessKey")]
        public virtual string SecretAccessKey { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>An AwsS3Data can be a data source, but not a data sink. In an AwsS3Data, an object's name is the S3
    /// object's key name.</summary>
    public class AwsS3Data : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>AWS access key used to sign the API requests to the AWS S3 bucket. Permissions on the bucket must
        /// be granted to the access ID of the AWS access key. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("awsAccessKey")]
        public virtual AwsAccessKey AwsAccessKey { get; set; } 

        /// <summary>S3 Bucket name (see [Creating a bucket](http://docs.aws.amazon.com/AmazonS3/latest/dev/create-
        /// bucket-get-location-example.html)). Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bucketName")]
        public virtual string BucketName { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Represents a whole calendar date, e.g. date of birth. The time of day and time zone are either
    /// specified elsewhere or are not significant. The date is relative to the Proleptic Gregorian Calendar. The day
    /// may be 0 to represent a year and month where the day is not significant, e.g. credit card expiration date. The
    /// year may be 0 to represent a month and day independent of year, e.g. anniversary date. Related types are
    /// [google.type.TimeOfDay][google.type.TimeOfDay] and `google.protobuf.Timestamp`.</summary>
    public class Date : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Day of month. Must be from 1 to 31 and valid for the year and month, or 0 if specifying a
        /// year/month where the day is not sigificant.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("day")]
        public virtual System.Nullable<int> Day { get; set; } 

        /// <summary>Month of year of date. Must be from 1 to 12.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("month")]
        public virtual System.Nullable<int> Month { get; set; } 

        /// <summary>Year of date. Must be from 1 to 9,999, or 0 if specifying a date without a year.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("year")]
        public virtual System.Nullable<int> Year { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A
    /// typical example is to use it as the request or the response type of an API method. For instance: service Foo {
    /// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); } The JSON representation for `Empty` is empty
    /// JSON object `{}`.</summary>
    public class Empty : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>An entry describing an error that has occurred.</summary>
    public class ErrorLogEntry : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>A list of messages that carry the error details.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("errorDetails")]
        public virtual System.Collections.Generic.IList<string> ErrorDetails { get; set; } 

        /// <summary>A URL that refers to the target (a data source, a data sink, or an object) with which the error is
        /// associated. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("url")]
        public virtual string Url { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A summary of errors by error code, plus a count and sample error log entries.</summary>
    public class ErrorSummary : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("errorCode")]
        public virtual string ErrorCode { get; set; } 

        /// <summary>Count of this type of error. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("errorCount")]
        public virtual System.Nullable<long> ErrorCount { get; set; } 

        /// <summary>Error samples.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("errorLogEntries")]
        public virtual System.Collections.Generic.IList<ErrorLogEntry> ErrorLogEntries { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>In a GcsData, an object's name is the Google Cloud Storage object's name and its `lastModificationTime`
    /// refers to the object's updated time, which changes when the content or the metadata of the object is
    /// updated.</summary>
    public class GcsData : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Google Cloud Storage bucket name (see [Bucket Name
        /// Requirements](https://cloud.google.com/storage/docs/bucket-naming#requirements)). Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bucketName")]
        public virtual string BucketName { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Google service account</summary>
    public class GoogleServiceAccount : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("accountEmail")]
        public virtual string AccountEmail { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>An HttpData specifies a list of objects on the web to be transferred over HTTP. The information of the
    /// objects to be transferred is contained in a file referenced by a URL. The first line in the file must be
    /// "TsvHttpData-1.0", which specifies the format of the file. Subsequent lines specify the information of the list
    /// of objects, one object per list entry. Each entry has the following tab-delimited fields: * HTTP URL * Length *
    /// MD5 - This field is a base64-encoded MD5 hash of the object An HTTP URL that points to the object to be
    /// transferred. It must be a valid URL with URL scheme HTTP or HTTPS. When an object with URL
    /// `http(s)://hostname:port/` is transferred to the data sink, the name of the object at the data sink is `/`.
    /// Length and MD5 provide the size and the base64-encoded MD5 hash of the object. If Length does not match the
    /// actual length of the object fetched, the object will not be transferred. If MD5 does not match the MD5 computed
    /// from the transferred bytes, the object transfer will fail. `lastModificationTime` is not available in HttpData
    /// objects. The objects that the URL list points to must allow public access. Storage Transfer Service obeys
    /// `robots.txt` rules and requires the HTTP server to support Range requests and to return a Content-Length header
    /// in each response.</summary>
    public class HttpData : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The URL that points to the file that stores the object list entries. This file must allow public
        /// access. Currently, only URLs with HTTP and HTTPS schemes are supported. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("listUrl")]
        public virtual string ListUrl { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The response message for
    /// [Operations.ListOperations][google.longrunning.Operations.ListOperations].</summary>
    public class ListOperationsResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The standard List next-page token.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>A list of operations that matches the specified filter in the request.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("operations")]
        public virtual System.Collections.Generic.IList<Operation> Operations { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Response from ListTransferJobs.</summary>
    public class ListTransferJobsResponse : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The list next page token.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nextPageToken")]
        public virtual string NextPageToken { get; set; } 

        /// <summary>A list of transfer jobs.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transferJobs")]
        public virtual System.Collections.Generic.IList<TransferJob> TransferJobs { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Conditions that determine which objects will be transferred.</summary>
    public class ObjectConditions : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>`excludePrefixes` must follow the requirements described for `includePrefixes`. The max size of
        /// `excludePrefixes` is 20.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("excludePrefixes")]
        public virtual System.Collections.Generic.IList<string> ExcludePrefixes { get; set; } 

        /// <summary>If `includePrefixes` is specified, objects that satisfy the object conditions must have names that
        /// start with one of the `includePrefixes` and that do not start with any of the `excludePrefixes`. If
        /// `includePrefixes` is not specified, all objects except those that have names starting with one of the
        /// `excludePrefixes` must satisfy the object conditions. Requirements: * Each include-prefix and exclude-prefix
        /// can contain any sequence of Unicode characters, of max length 1024 bytes when UTF8-encoded, and must not
        /// contain Carriage Return or Line Feed characters. Wildcard matching and regular expression matching are not
        /// supported. * None of the include-prefix or the exclude-prefix values can be empty, if specified. * Each
        /// include-prefix must include a distinct portion of the object namespace, i.e., no include-prefix may be a
        /// prefix of another include-prefix. * Each exclude-prefix must exclude a distinct portion of the object
        /// namespace, i.e., no exclude-prefix may be a prefix of another exclude-prefix. * If `includePrefixes` is
        /// specified, then each exclude-prefix must start with the value of a path explicitly included by
        /// `includePrefixes`. The max size of `includePrefixes` is 20.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("includePrefixes")]
        public virtual System.Collections.Generic.IList<string> IncludePrefixes { get; set; } 

        /// <summary>`maxTimeElapsedSinceLastModification` is the complement to
        /// `minTimeElapsedSinceLastModification`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("maxTimeElapsedSinceLastModification")]
        public virtual string MaxTimeElapsedSinceLastModification { get; set; } 

        /// <summary>If unspecified, `minTimeElapsedSinceLastModification` takes a zero value and
        /// `maxTimeElapsedSinceLastModification` takes the maximum possible value of Duration. Objects that satisfy the
        /// object conditions must either have a `lastModificationTime` greater or equal to `NOW` -
        /// `maxTimeElapsedSinceLastModification` and less than `NOW` - `minTimeElapsedSinceLastModification`, or not
        /// have a `lastModificationTime`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("minTimeElapsedSinceLastModification")]
        public virtual string MinTimeElapsedSinceLastModification { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>This resource represents a long-running operation that is the result of a network API call.</summary>
    public class Operation : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>If the value is `false`, it means the operation is still in progress. If true, the operation is
        /// completed and the `result` is available.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("done")]
        public virtual System.Nullable<bool> Done { get; set; } 

        /// <summary>The error result of the operation in case of failure.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("error")]
        public virtual Status Error { get; set; } 

        /// <summary>Represents the transfer operation object.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("metadata")]
        public virtual System.Collections.Generic.IDictionary<string,object> Metadata { get; set; } 

        /// <summary>The server-assigned name, which is only unique within the same service that originally returns it.
        /// If you use the default HTTP mapping above, the `name` should have the format of
        /// `operations/some/unique/name`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The normal response of the operation in case of success. If the original method returns no data on
        /// success, such as `Delete`, the response is `google.protobuf.Empty`. If the original method is standard
        /// `Get`/`Create`/`Update`, the response should be the resource. For other methods, the response should have
        /// the type `XxxResponse`, where `Xxx` is the original method name. For example, if the original method name is
        /// `TakeSnapshot()`, the inferred response type is `TakeSnapshotResponse`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("response")]
        public virtual System.Collections.Generic.IDictionary<string,object> Response { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Request passed to PauseTransferOperation.</summary>
    public class PauseTransferOperationRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Request passed to ResumeTransferOperation.</summary>
    public class ResumeTransferOperationRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Transfers can be scheduled to recur or to run just once.</summary>
    public class Schedule : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The last day the recurring transfer will be run. If `scheduleEndDate` is the same as
        /// `scheduleStartDate`, the transfer will be executed only once.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("scheduleEndDate")]
        public virtual Date ScheduleEndDate { get; set; } 

        /// <summary>The first day the recurring transfer is scheduled to run. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("scheduleStartDate")]
        public virtual Date ScheduleStartDate { get; set; } 

        /// <summary>The time in UTC at which the transfer will be scheduled to start in a day. Transfers may start
        /// later than this time. If not specified, transfers are scheduled to start at midnight UTC.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("startTimeOfDay")]
        public virtual TimeOfDay StartTimeOfDay { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>The `Status` type defines a logical error model that is suitable for different programming
    /// environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). The error model
    /// is designed to be: - Simple to use and understand for most users - Flexible enough to meet unexpected needs #
    /// Overview The `Status` message contains three pieces of data: error code, error message, and error details. The
    /// error code should be an enum value of [google.rpc.Code][google.rpc.Code], but it may accept additional error
    /// codes if needed. The error message should be a developer-facing English message that helps developers
    /// *understand* and *resolve* the error. If a localized user-facing error message is needed, put the localized
    /// message in the error details or localize it in the client. The optional error details may contain arbitrary
    /// information about the error. There is a predefined set of error detail types in the package `google.rpc` which
    /// can be used for common error conditions. # Language mapping The `Status` message is the logical representation
    /// of the error model, but it is not necessarily the actual wire format. When the `Status` message is exposed in
    /// different client libraries and different wire protocols, it can be mapped differently. For example, it will
    /// likely be mapped to some exceptions in Java, but more likely mapped to some error codes in C. # Other uses The
    /// error model and the `Status` message can be used in a variety of environments, either with or without APIs, to
    /// provide a consistent developer experience across different environments. Example uses of this error model
    /// include: - Partial errors. If a service needs to return partial errors to the client, it may embed the `Status`
    /// in the normal response to indicate the partial errors. - Workflow errors. A typical workflow has multiple steps.
    /// Each step may have a `Status` message for error reporting purpose. - Batch operations. If a client uses batch
    /// request and batch response, the `Status` message should be used directly inside batch response, one for each
    /// error sub-response. - Asynchronous operations. If an API call embeds asynchronous operation results in its
    /// response, the status of those operations should be represented directly using the `Status` message. - Logging.
    /// If some API errors are stored in logs, the message `Status` could be used directly after any stripping needed
    /// for security/privacy reasons.</summary>
    public class Status : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("code")]
        public virtual System.Nullable<int> Code { get; set; } 

        /// <summary>A list of messages that carry the error details. There will be a common set of message types for
        /// APIs to use.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("details")]
        public virtual System.Collections.Generic.IList<System.Collections.Generic.IDictionary<string,object>> Details { get; set; } 

        /// <summary>A developer-facing error message, which should be in English. Any user-facing error message should
        /// be localized and sent in the [google.rpc.Status.details][google.rpc.Status.details] field, or localized by
        /// the client.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("message")]
        public virtual string Message { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Represents a time of day. The date and time zone are either not significant or are specified elsewhere.
    /// An API may chose to allow leap seconds. Related types are [google.type.Date][google.type.Date] and
    /// `google.protobuf.Timestamp`.</summary>
    public class TimeOfDay : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Hours of day in 24 hour format. Should be from 0 to 23. An API may choose to allow the value
        /// "24:00:00" for scenarios like business closing time.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("hours")]
        public virtual System.Nullable<int> Hours { get; set; } 

        /// <summary>Minutes of hour of day. Must be from 0 to 59.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("minutes")]
        public virtual System.Nullable<int> Minutes { get; set; } 

        /// <summary>Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("nanos")]
        public virtual System.Nullable<int> Nanos { get; set; } 

        /// <summary>Seconds of minutes of the time. Must normally be from 0 to 59. An API may allow the value 60 if it
        /// allows leap-seconds.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("seconds")]
        public virtual System.Nullable<int> Seconds { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A collection of counters that report the progress of a transfer operation.</summary>
    public class TransferCounters : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Bytes that are copied to the data sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bytesCopiedToSink")]
        public virtual System.Nullable<long> BytesCopiedToSink { get; set; } 

        /// <summary>Bytes that are deleted from the data sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bytesDeletedFromSink")]
        public virtual System.Nullable<long> BytesDeletedFromSink { get; set; } 

        /// <summary>Bytes that are deleted from the data source.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bytesDeletedFromSource")]
        public virtual System.Nullable<long> BytesDeletedFromSource { get; set; } 

        /// <summary>Bytes that failed to be deleted from the data sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bytesFailedToDeleteFromSink")]
        public virtual System.Nullable<long> BytesFailedToDeleteFromSink { get; set; } 

        /// <summary>Bytes found in the data source that are scheduled to be transferred, which will be copied, excluded
        /// based on conditions, or skipped due to failures.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bytesFoundFromSource")]
        public virtual System.Nullable<long> BytesFoundFromSource { get; set; } 

        /// <summary>Bytes found only in the data sink that are scheduled to be deleted.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bytesFoundOnlyFromSink")]
        public virtual System.Nullable<long> BytesFoundOnlyFromSink { get; set; } 

        /// <summary>Bytes in the data source that failed during the transfer.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bytesFromSourceFailed")]
        public virtual System.Nullable<long> BytesFromSourceFailed { get; set; } 

        /// <summary>Bytes in the data source that are not transferred because they already exist in the data
        /// sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("bytesFromSourceSkippedBySync")]
        public virtual System.Nullable<long> BytesFromSourceSkippedBySync { get; set; } 

        /// <summary>Objects that are copied to the data sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("objectsCopiedToSink")]
        public virtual System.Nullable<long> ObjectsCopiedToSink { get; set; } 

        /// <summary>Objects that are deleted from the data sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("objectsDeletedFromSink")]
        public virtual System.Nullable<long> ObjectsDeletedFromSink { get; set; } 

        /// <summary>Objects that are deleted from the data source.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("objectsDeletedFromSource")]
        public virtual System.Nullable<long> ObjectsDeletedFromSource { get; set; } 

        /// <summary>Objects that failed to be deleted from the data sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("objectsFailedToDeleteFromSink")]
        public virtual System.Nullable<long> ObjectsFailedToDeleteFromSink { get; set; } 

        /// <summary>Objects found in the data source that are scheduled to be transferred, which will be copied,
        /// excluded based on conditions, or skipped due to failures.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("objectsFoundFromSource")]
        public virtual System.Nullable<long> ObjectsFoundFromSource { get; set; } 

        /// <summary>Objects found only in the data sink that are scheduled to be deleted.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("objectsFoundOnlyFromSink")]
        public virtual System.Nullable<long> ObjectsFoundOnlyFromSink { get; set; } 

        /// <summary>Objects in the data source that failed during the transfer.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("objectsFromSourceFailed")]
        public virtual System.Nullable<long> ObjectsFromSourceFailed { get; set; } 

        /// <summary>Objects in the data source that are not transferred because they already exist in the data
        /// sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("objectsFromSourceSkippedBySync")]
        public virtual System.Nullable<long> ObjectsFromSourceSkippedBySync { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>This resource represents the configuration of a transfer job that runs periodically.</summary>
    public class TransferJob : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>This field cannot be changed by user requests.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("creationTime")]
        public virtual string CreationTime { get; set; } 

        /// <summary>This field cannot be changed by user requests.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("deletionTime")]
        public virtual string DeletionTime { get; set; } 

        /// <summary>A description provided by the user for the job. Its max length is 1024 bytes when Unicode-
        /// encoded.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("description")]
        public virtual string Description { get; set; } 

        /// <summary>This field cannot be changed by user requests.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("lastModificationTime")]
        public virtual string LastModificationTime { get; set; } 

        /// <summary>A globally unique name assigned by Storage Transfer Service when the job is created. This field
        /// should be left empty in requests to create a new transfer job; otherwise, the requests result in an
        /// `INVALID_ARGUMENT` error.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The ID of the Google Developers Console project that owns the job. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("projectId")]
        public virtual string ProjectId { get; set; } 

        /// <summary>Schedule specification. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("schedule")]
        public virtual Schedule Schedule { get; set; } 

        /// <summary>Status of the job. This value MUST be specified for `CreateTransferJobRequests`. NOTE: The effect
        /// of the new job status takes place during a subsequent job run. For example, if you change the job status
        /// from `ENABLED` to `DISABLED`, and an operation spawned by the transfer is running, the status change would
        /// not affect the current operation.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("status")]
        public virtual string Status { get; set; } 

        /// <summary>Transfer specification. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transferSpec")]
        public virtual TransferSpec TransferSpec { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>A description of the execution of a transfer.</summary>
    public class TransferOperation : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Information about the progress of the transfer operation.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("counters")]
        public virtual TransferCounters Counters { get; set; } 

        /// <summary>End time of this transfer execution.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("endTime")]
        public virtual string EndTime { get; set; } 

        /// <summary>Summarizes errors encountered with sample error log entries.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("errorBreakdowns")]
        public virtual System.Collections.Generic.IList<ErrorSummary> ErrorBreakdowns { get; set; } 

        /// <summary>A globally unique ID assigned by the system.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("name")]
        public virtual string Name { get; set; } 

        /// <summary>The ID of the Google Developers Console project that owns the operation. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("projectId")]
        public virtual string ProjectId { get; set; } 

        /// <summary>Start time of this transfer execution.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("startTime")]
        public virtual string StartTime { get; set; } 

        /// <summary>Status of the transfer operation.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("status")]
        public virtual string Status { get; set; } 

        /// <summary>The name of the transfer job that triggers this transfer operation.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transferJobName")]
        public virtual string TransferJobName { get; set; } 

        /// <summary>Transfer specification. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transferSpec")]
        public virtual TransferSpec TransferSpec { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>TransferOptions uses three boolean parameters to define the actions to be performed on objects in a
    /// transfer.</summary>
    public class TransferOptions : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>Whether objects should be deleted from the source after they are transferred to the sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("deleteObjectsFromSourceAfterTransfer")]
        public virtual System.Nullable<bool> DeleteObjectsFromSourceAfterTransfer { get; set; } 

        /// <summary>Whether objects that exist only in the sink should be deleted.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("deleteObjectsUniqueInSink")]
        public virtual System.Nullable<bool> DeleteObjectsUniqueInSink { get; set; } 

        /// <summary>Whether overwriting objects that already exist in the sink is allowed.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("overwriteObjectsAlreadyExistingInSink")]
        public virtual System.Nullable<bool> OverwriteObjectsAlreadyExistingInSink { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Configuration for running a transfer.</summary>
    public class TransferSpec : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>An AWS S3 data source.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("awsS3DataSource")]
        public virtual AwsS3Data AwsS3DataSource { get; set; } 

        /// <summary>A Google Cloud Storage data sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("gcsDataSink")]
        public virtual GcsData GcsDataSink { get; set; } 

        /// <summary>A Google Cloud Storage data source.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("gcsDataSource")]
        public virtual GcsData GcsDataSource { get; set; } 

        /// <summary>An HTTP URL data source.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("httpDataSource")]
        public virtual HttpData HttpDataSource { get; set; } 

        /// <summary>Only objects that satisfy these object conditions are included in the set of data source and data
        /// sink objects. Object conditions based on objects' `lastModificationTime` do not exclude objects in a data
        /// sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("objectConditions")]
        public virtual ObjectConditions ObjectConditions { get; set; } 

        /// <summary>If the option `deleteObjectsUniqueInSink` is `true`, object conditions based on objects'
        /// `lastModificationTime` are ignored and do not exclude objects in a data source or a data sink.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transferOptions")]
        public virtual TransferOptions TransferOptions { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }    

    /// <summary>Request passed to UpdateTransferJob.</summary>
    public class UpdateTransferJobRequest : Google.Apis.Requests.IDirectResponseSchema
    {
        /// <summary>The ID of the Google Developers Console project that owns the job. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("projectId")]
        public virtual string ProjectId { get; set; } 

        /// <summary>The job to update. Required.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("transferJob")]
        public virtual TransferJob TransferJob { get; set; } 

        /// <summary>The field mask of the fields in `transferJob` that are to be updated in this request. Fields in
        /// `transferJob` that can be updated are: `description`, `transferSpec`, and `status`. To update the
        /// `transferSpec` of the job, a complete transfer specification has to be provided. An incomplete specification
        /// which misses any required fields will be rejected with the error `INVALID_ARGUMENT`.</summary>
        [Newtonsoft.Json.JsonPropertyAttribute("updateTransferJobFieldMask")]
        public virtual string UpdateTransferJobFieldMask { get; set; } 

        /// <summary>The ETag of the item.</summary>
        public virtual string ETag { get; set; }
    }
}
